// ============================== 导入依赖 ============================== //

import MAP from '../MAP'
import CORE from '../UTIL'
import util from './util'

const ListClass = {}

// ============================== 状态集 ============================== //

const state = {
  // —————————————————————————————— 数据 —————————————————————————————— //

  /**
   * 接口
   */
  API: {
    ...util.API,
    validParam(param, state, root) {
      return true
    },
    transParam(param, context) {
      return param
    },
    getList: null,
    dealList(other, context) {
      //
    },
    transList(arr, context) {
      return arr
    },
  },

  /**
   * 映射
   */
  MAP: {
    WORD: '', // 词语 (初始常量，不可更新)

    GET: null, // 获取 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')
    LIST: null, // 列表 (为 null 取 CORE.MAP.TIP_XXX，可设置为 '')

    tipList: '', // 列表提示 (有值时直接使用，无值时拼接生成)
  },

  /**
   * 字典
   */
  DICT: {
    //
  },

  /**
   * 初始配置
   */
  INIT_CONFIG: {
    /**
     * 是否为长列表
     *
     * true  长列表
     * false 分页列表
     */
    IS_LONG_LIST: false,

    /**
     * 重置时是否保持复选
     *
     * true  保持复选
     * false 重置复选 (将 param.idList = param.rowList = [])
     */
    RESET_KEEP_CHECK: false,

    /**
     * 销毁前是否保持参数不变
     *
     * true  保留参数
     * false 重置参数 (将 INIT_PARAM 合并到 param)
     */
    DESTROY_KEEP_PARAM: false,
  },

  /**
   * 初始参数
   *
   * 1. 初始存在，才能响应
   * 2. CORE.mixStore(store) 时使用
   * 3. setParam() 重置时使用
   * 3. WebSearch 高级查询点重置时使用
   */
  INIT_PARAM: CORE.initObj(ListClass, {
    page: 1,
  }),

  /**
   * 查询参数
   */
  param: { page: 1 },

  /**
   * 数据总数
   */
  total: 0,

  /**
   * 列表
   */
  list: [],

  /**
   * 表格
   *
   * // 获取数据，dataList 不传则取表格当前的数据，返回 { titleList, widthList, arrayList }
   * this.refTable.getData(dataList, baseWidth = 128)
   *
   * // 导出 EXCEL 文件，调用 CORE.excelExport(fileName, { ...data, sheetName })
   * this.refTable.export(fileName, dataList, baseWidth = 128, sheetName = 'Sheet1')
   */
  refTable: null,

  // —————————————————————————————— 开关 —————————————————————————————— //

  /**
   * 远程列表开关
   */
  needList: false,

  /**
   * 列表就绪开关
   */
  readyList: false,
}

// ============================== 计算属性 ============================== //

const getters = {
  /**
   * 列表是否为空
   */
  isEmpty: ({ total, needList, readyList }) => readyList ? !total : !needList,

  /**
   * 列表是否完成
   */
  isFinish: ({ total, param }) => !total || total <= param.page * param[MAP.PAGE_SIZE],
}

// ============================== 同步更新 ============================== //

const mutations = {
  // —————————————————————————————— 设置 —————————————————————————————— //

  /**
   * 设置参数
   */
  setParam(state, param) {
    util.setClone(state, param, 'param')
  },

  /**
   * 设置总数
   */
  setTotal(state, total) {
    state.total = total || 0
  },

  /**
   * 设置列表
   */
  setList(state, list) {
    const setList = state.INIT_CONFIG.IS_LONG_LIST ? 'setLongList' : 'setPageList'
    util[setList](state, list)
  },

  /**
   * 设置表格
   */
  setRefTable(state, refTable) {
    state.refTable = refTable || null
  },

  // —————————————————————————————— 监听 —————————————————————————————— //

  /**
   * 开始远程列表
   */
  startList(state, page) {
    const { API, INIT_CONFIG, param } = state
    if (API.validParam(state.param, state, this)) {
      if (CORE.isNumber(page)) param.page = page // 指定页码
      else if (INIT_CONFIG.IS_LONG_LIST) param.page++ // 长列表，页码自增
      util.start('List', state)
    } else {
      const setList = INIT_CONFIG.IS_LONG_LIST ? 'setLongList' : 'setPageList'
      util[setList](state, []) // 重置列表
      state.total = 0 // 重置总数
    }
  },

  /**
   * 完成远程列表
   */
  completeList(state, data) {
    let msgSuccess = ''
    const setList = state.INIT_CONFIG.IS_LONG_LIST ? 'setLongList' : 'setPageList'
    if (CORE.isArray(data)) {
      if (CORE.isNumber(data[0])) state.total = data[0] // 设置总数
      if (CORE.isArray(data[1])) util[setList](state, data[1]) // 设置列表
      if (CORE.isString(data[2])) msgSuccess = data[2] // 成功消息
    }
    util.complete('List', state, msgSuccess)
  },

  /**
   * 终止远程列表
   */
  stopList(state, e) {
    if (!state.INIT_CONFIG.IS_LONG_LIST) state.list = [] // 重置分页列表
    util.stop('List', state, e)
  },
}

// ============================== 异步调用 ============================== //

const actions = {
  // —————————————————————————————— 列表 —————————————————————————————— //

  async remoteList(context) {
    const { state: { API, MAP, param } } = context
    const TIP = API.transTip(MAP.tipList, this.state.API) // 拼上根模块 API 的菜单

    // 接口检测
    if (!API.getList) throw util.errorAPI(MAP.tipList, 'getList')

    // 参数转换
    const myParam = await API.transParam(param, context)

    // 接口调用
    const [num, arr, ...other] = await API.getList(myParam, TIP)

    // 列表处理
    API.dealList(other, context)

    // 列表转换
    return [num, API.transList(arr, context)]
  },
}

// ============================== 导出仓库 ============================== //

export default { state, getters, mutations, actions }
